package fr.uniscol.dao.impl;

import fr.uniscol.dao.IClasseDao;
import fr.uniscol.dao.UniscolDaoSupport;
import static fr.uniscol.dao.impl.SQLNames.*;
import fr.uniscol.dao.mapper.ClasseRowMapper;
import fr.uniscol.dao.mapper.MEFRowMapper;
import fr.uniscol.model.BaseAnneeScolaire;
import fr.uniscol.model.Classe;
import fr.uniscol.model.MEF;
import java.util.List;
import org.springframework.stereotype.Repository;

@Repository("classeDao")
public class ClasseDaoImpl extends UniscolDaoSupport implements IClasseDao {

	@Override
	public List<Classe> getAllClassesOfEtablissement(BaseAnneeScolaire base) {
	
		List<Classe> classes = getJdbcTemplate().query("SELECT cl.* FROM " + TABLE_STRUCTURE + " cl "
                                                                + "WHERE baseid=? "
                                                                + "AND type_structure='CL'", new Object[]{
			base.getId(), 
		}, new ClasseRowMapper(base));
		 
		return classes;
	}

	@Override
	public Classe getClasseById(long classeId) {
		
		Classe classe = (Classe) getJdbcTemplate().queryForObject("SELECT * FROM " + TABLE_STRUCTURE + " WHERE structureid=? ", new Object[]{
			classeId
		}, new ClasseRowMapper());
		
		return classe;
	}
	
	@Override
	public Classe saveClasse(Classe classe) {
		
		if(classe.getBase() == null){
			throw new NullPointerException("Pas de base associée à la classe: " + classe);
		}
		
		String req = "";
		Object[] params = null;
        
        long classeId = 0;
		
		int rowAffected = 0;
		if(classe.getId() == 0){						
            // Nouvelle classe à ajouter
            req = "INSERT INTO " + TABLE_STRUCTURE + " (baseid, libelle, id_siecle, type_structure) VALUES(?, ?, ?, 'CL')";
            params = new Object[]{
                classe.getBase().getId(),
                classe.getLibelle(),
                classe.getCodeStructure()
            };

            rowAffected = getJdbcTemplate().update(req, params);
            if(rowAffected != 1){
                return null;
            }
            
            classeId = getJdbcTemplate().queryForObject("SELECT LAST_INSERT_ID()", Long.class);
            classe.setId(classeId);
			
		}else{
			// Mise à jour des données
			req = "UPDATE " + TABLE_STRUCTURE + " SET libelle=? WHERE structureid=?";
			params = new Object[]{
				classe.getLibelle(),
				classe.getId()
			};
			
			rowAffected = getJdbcTemplate().update(req, params);
            if(rowAffected != 1){
                return null;
            }
		}
        
		return classe;
	}

    @Override
    public boolean deleteClasse(Classe classe) {
        
        int rowsAffected = getJdbcTemplate().update("DELETE FROM uni_structure WHERE structureid=?", new Object[]{
           classe.getId()
        });
        
        return rowsAffected == 1;
    }
    
    @Override
    public List<MEF> getMefsAppartenanceOfStructure(Classe classe) {
        
        List<MEF> mefs = getJdbcTemplate().query("SELECT m.* FROM " + TABLE_MEF_STRUCTURE + " ma, " + TABLE_MEF + " m, " + TABLE_STRUCTURE + " s "
            + "WHERE m.baseid=? AND s.structureid=? "
            + "AND m.baseid=s.baseid "
            + "AND m.mefid=ma.mefid "
            + "AND s.structureid=ma.structureid", new Object[]{
           classe.getBase().getId(),
           classe.getId()
        }, new MEFRowMapper());
        
        return mefs;
    }
}
